"""数据库会话与引擎管理

职责：
- 初始化 SQLModel 引擎
- 提供建表方法
- 提供 FastAPI 依赖项 `get_session` 用于注入数据库会话
"""

from typing import Generator

from sqlmodel import SQLModel, create_engine, Session

from .config import settings


def _build_engine_url_and_args() -> tuple[str, dict]:
    """拼装数据库连接串与连接参数

    - SQLite 在多线程环境（例如 Uvicorn）下需要 `check_same_thread=False`。
    - 其它数据库通常不需要特殊参数。
    """
    database_url = settings.DATABASE_URL
    connect_args: dict = {}
    if database_url.startswith("sqlite"):
        connect_args = {"check_same_thread": False}
    return database_url, connect_args


DATABASE_URL, CONNECT_ARGS = _build_engine_url_and_args()
engine = create_engine(DATABASE_URL, echo=False, connect_args=CONNECT_ARGS)


def create_db_and_tables() -> None:
    """在应用启动时创建数据库与表结构（如不存在）"""
    SQLModel.metadata.create_all(engine)


def get_session() -> Generator[Session, None, None]:
    """FastAPI 依赖：按请求上下文提供一个数据库会话"""
    with Session(engine) as session:
        yield session



